---
title: 配置解析
---

MyBatis 的配置文包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下：

* **properties (属性)**
* **settings (设置)**
* **typeAliases (类型别名)**
* typeHandlers (类型处理器)
* objectFactory (对象工厂)
* plugins (插件)
* **environments (环境配置)**
    * environment (环境变量)
        * transactionManager (事务管理器)
        * dataSource (数据源)
* **databaseIdProvider (数据库厂商标识)**
* **mappers (映射器)**

## 属性(properties)

可以通过 properties 属性引入配置文件，这些属性都是可外部配置且可动态替换的。
:::tip
在 xml 中，所有的标签都有顺序。
:::

1. 编写一个数据库配置文件
   ```properties db.properties
    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://43.136.173.173:3306/mybatis?useSSL=true&amp;serverTimezone=UTC&amp;useUnicode=true
    username=root
    password=Zbb010719!
   ```
2. 在 mybatis-config.xml 中引入配置文件
   ```xml
    <properties resource="db.properties"/>
   ```
3. 在 mybatis-config.xml 中使用配置文件中的属性
   ```xml
    <dataSource type="POOLED">
        <property name="driver" value="${driver}"></property>
        <property name="url" value="${url}"></property>
        <property name="username" value="${username}"></property>
        <property name="password" value="${password}"></property>
    </dataSource>
   ```

可以引入外部文件；可以在其中增加一些属性配置；如果两个文件有相同的属性，优先使用外部配置文件的。

## 设置 (settings)

## 类型别名(typeAliases)

类型别名是为 Java 类型设置一个短的名字。 它仅用于 XML 配置，意在降低冗余的全限定类名书写。

```xml title='这样配置时,User 可以替代 pub.wkq.pojo.User'

<typeAliases>
    <typeAlias type="pub.wkq.pojo.User" alias="User"/>
</typeAliases>
```

也可以指定一个包名，MyBatis 会在包名下搜索需要的 Java Bean，比如：

```xml

<typeAliases>
    <package name="pub.wkq.pojo"/>
</typeAliases>
```

此时还可以通过 @Alias 注解自定义类型别名：

:::tip
如果实体类十分多，建议使用第二种。
:::
Java 有一些内建的类型别名，它们都是不区分大小写的：

| 别名         | 映射的类型      |
|------------|------------|
| _byte      | byte       |
| _long      | long       |
| _short     | short      |
| _int       | int        |
| _integer   | int        |
| _double    | double     |
| _float     | float      |
| _boolean   | boolean    |
| string     | String     |
| byte       | Byte       |
| long       | Long       |
| short      | Short      |
| int        | Integer    |
| integer    | Integer    |
| double     | Double     |
| float      | Float      |
| boolean    | Boolean    |
| date       | Date       |
| decimal    | BigDecimal |
| object     | Object     |
| map        | HashMap    |
| list       | List       |
| arrayList  | ArrayList  |
| collection | Collection |
| iterator   | Iterator   |

## 映射器(mappers)

MapperRegistry： 注册绑定我们的 Mapper 文件

```xml title='使用相对与类路径的资源引用'

<mappers>
    <mapper resource="pub/wkq/dao/UserMapper.xml"/>
</mappers>
```

```xml title='使用映射器接口实现类的完全限定类名'

<mappers>
    <mapper class="pub.wkq.dao.UserMapper"/>
</mappers>
```

使用映射器接口实现类的完全限定类名注意点：

* 接口和它的 Mapper 配置文件必须同名
* 接口和它的 Mapper 配置文件必须在同一个包下


```xml title='将包内的映射器接口实现全部注册为映射器'

<mappers>
    <package name="pub.wkq.dao"/>
</mappers>
```
使用扫描包注意点和使用映射器接口实现类的完全限定类名注意点相同。


## 环境配置(environments)

MyBatis 可以配置成适应多种环境，这种机制有助于将 SQL 映射应用于多种数据库之中。例如，开发、测试和生产环境需要有不同的配置；或者想在具有相同
Schema 的多个生产数据库中使用相同的 SQL 映射。有很多类似的使用场景。

**尽管可以配置多个环境，但每个 SqlSessionFactory 实例只能选择一种环境。**

所以，如果你想连接两个数据库，就需要创建两个 SqlSessionFactory 实例，每个数据库对应一个。

**每个数据库对应一个 SqlSessionFactory 实例**

::: tip
MyBatis 默认的事务管理器就是 JDBC,POOLED
:::

### 事务管理器(transactionManager)

在 MyBatis 中有两种类型的事务管理器(也就是 type=`[JDBC|MANAGED]`)：

* JDBC - 这个配置直接使用了 JDBC 的提交和回滚功能，它依赖从数据源获得的连接来管理事务作用域。默认情况下，它在关闭连接时启用了自动提交。
  ```xml
  <transactionManager type="JDBC">
    <property name="skipSetAutoCommitOnClose" value="true"/>
  </transactionManager>
  ```

* MANAGED - 这个配置几乎没做什么。它从不提交或回滚一个连接，而是让容器来管理事务的整个生命周期（比如 JEE
  应用服务器的上下文）。默认情况下它会关闭连接。
  ```xml
  <transactionManager type="MANAGED"/>
  ```

这两种事务管理器类型都不需要设置任何属性,它们其实是类型别名。换句话，你可以在配置的任何地方使用这些类型别名，只要使用的是
TransactionFactory 接口实现类的全限定名或类型别名代替它们。

:::tip
如果正在使用 Spring + MyBatis ，则没有必要配置事务管理器，因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
:::

### 数据源(dataSource)

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。比如：

有三种内建的数据源类型，也就是 type = ['UNPOOLED|POOLED|JNDI']：

* UNPOOLED - 这个数据源的实现只是每次被请求时打开和关闭连接。
* POOLED - 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。这个数据源的实现包括了一些能够配置的参数，比如
  池中连接数量的最大值，以及在被清除之前连接可以保持的最大时间等。这是一种使得并发 Web 应用快速响应请求的流式处理方式。
* JNDI - 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用，容器可以集中或在外部配置数据源，然后放置一个 JNDI
  上下文的引用。

## 其它配置

* typeHandlers(类型处理器)
* objectFactory(对象工厂)
* plugins(插件)
    * mybatis-generator-core
    * mybatis-plus
    * 通用 mapper

